其他
语音识别中的WFST和语言模型
The following article is from 58技术 Author 周维
导读
在语音识别系统中,有限加权状态转换机(Weighted Finite State Transducers, WFST)扮演着重要角色。本文主要介绍发音词典、语言模型和WFST的原理,以及在实践过程中的一些优化方法。
背景
目前的实际场景中的语音识别系统更多是基于HMM的传统语音识别框架,如:DNN-HMM,这种框架是由声学模型、发音词典、语言模型和解码器构成的pipeline结构,其中声学模型建模粒度为比音素还小的三音素状态,而语言模型和WFST在其中扮演着重要的角色。本文将主要围绕三个问题展开:(1)如何实现从HMM状态到句子的映射;(2)WFST如何优化解码效率;(3)在实际应用时,如何使用Lattice Rescore等方法适应不同的业务场景。首先,我们会回顾一下语音识别的背景知识,介绍传统语音识别的架构和基本概念,以及发音词典和语言模型的原理。进而,介绍WFST的定义和基本操作,以及WFST在语音识别中发挥的作用。最后,我们将以实际场景为例,从解码图的角度介绍一些语音识别的优化方法。
语音识别简介
语音识别(Automatic Speech Recognition, ASR)的目标是将人类的语音内容转换为相应的文字。系统的输入通常是一段完整的长录音(或语音流),录音需要先经过语音端点检测(Voice Activity Detection, VAD)将人声的片段截取出来,语音识别会将语音中的内容转写为文字,其中会包含大量口语、重复、语法错误等情况,且语音识别不会为句子添加标点。这时,系统需要一个后处理模块,使用顺滑技术将明显的口语问题“整理”为通顺的句子,并为句子加上标点。同时,说话人分离、说话人识别、语音情绪识别等模块,会为每段语音打上说话人、性别、情绪等标签,与转写的文字一同作为下游NLP模块的输入,进而转化为意图、情感、槽位等可用信息。发音词典和语音模型
1、语言模型
语言模型表示一个句子出现的概率,对于下图中的四句话来说,第四句“火腿吃猫喜欢”明显是一句不通顺的句子,因此,我们希望语言模型可以给前三句话较高的分数,给最后一句话很低的分数。语言模型的公式化表达为P(W),因为句子是千变万化的,所以将句子分词后再建模。分词后,一句话出现的概率就表示为其中每个单词在当前上下文中出现的概率之积。使用马尔科夫假设,每个单词的概率只与前N个单词有关,基于这样思想构造的语言模型为ngram。
2、语言模型的平滑
还是上节的例子,试着计算 “老鼠 喜欢 吃 火腿”的概率,因为“老鼠”从来没有作为句子的开始,且“老鼠”后面从来没有出现过“喜欢”,所以P(老鼠|<s>)和P(喜欢|老鼠)都是0,这会导致整个句子的得分为0,但是这明显是一句通顺的句子,只是因为这样的组合在语料中没有出现过就让整句的概率为0是不合理的,为了解决这一问题,提出了平滑算法(Smoothing)[1][6]。3、困惑度
语言模型的评价方法为困惑度(perplexity, ppl),表示为每个单词概率倒数的几何平均数,经过取log变换后,与交叉熵的形式相同,其大小表示当前句子的“通顺”程度,通常相对值更加有意义。4、语言模型工具
在使用kaldi[10]语音识别框架时,需要把语言模型表示为ARPA格式,如下图所示,主要分为头部以及各阶ngram的单词和分数,包含三列,分别为当前单词出现概率的log10、单词和回退概率的log10。5、发音词典
发音词典则给出了每个单词对应的音素序列,如下图所示。目前,常用的开源中文词典有thchs30和CC-CEDICT,英文词典有CMU-dict。词典中的单词决定了这个词在解码时出现的概率,所以通常需要根据业务需求挖掘词典,并生成音素序列,这个功能称为g2p (Grapheme-to-Phoneme),目前有Sequitur G2P、g2p-seq2seq等工具可以用来训练发音词典生成模型。WFST
1、WFST的定义
有限加权状态转换机(Weighted Finite State Transducers, WFST)是有限自动机(Finite Automaton, FA)家族中的一员,FA由(A, Q, E, I, F)五个元素组成,其中Q为状态集合,表示图中的节点,A为Label集合,表示边上的符号, E为转移函数集合,两个状态节点和他们之间的边以及边上的label和weight构成了一次转移(transition),I为初始状态,在图中使用较粗的圆圈表示,为搜索的起点,F为终止状态,在图中使用双环形圆圈表示,为搜索的终点。2、半环
WFST中的操作是基于半环(Semiring)理论构建的[4],半环是抽象代数的概念,简单来说就是对集合、加法和乘法等概念的抽象。如下图所示,列举了四种常见的半环,其中SET表示定义域,加法可以理解为并联操作,乘法可以理解为串联操作,单位0表示加单元,单位1表示乘单元。3、组合(Composition)
组合操作通过连接两个图的输入与输出,将两个不同level的WFST组合为一个WFST,通常使用空心圆圈表示组合的符号,如下面公式中所示,表示T1和T2两个图的组合。4、 确定化(Determinization)
如果一个图是确定化的,给定一个输入序列,在图中只能找到一条路径与其对应。如下图所示,左图为未确定化的图,右图为确定化后的图,当输入序列为“ab”时,左图的路径有两个,而右图的路径只有一个。语音识别中的WFST
1、HCLG解码图
回到文章最初提出的问题,我们希望用WFST建立从HMM状态到单词的映射,并且尽可能的优化解码搜索效率。根据组合操作的定义,图a的输出与图b的输入相同时,即可进行组合。在传统语音识别的流程中,使用H表示HMM拓扑结构,输入为HMM状态(state),输出为三音素(triphone),权重为HMM的转移概率;使用C表示三音素到单音素的映射,输入为三音素,输出为单音素(上下文无关音素,CI phone);L表示发音词典,输入为音素,输出为单词,权重为发音概率;G表示语言模型,输入为单词,输出为单词,权重为语言模型打分。根据WFST的组合操作,可以将上面四张图进行组合,组合后的图称为HCLG,其输入为HMM状态序列,输出为单词序列,则HCLG就是我们希望的模型,通常被称为解码图。2、Lattice
为了保证解码效率,对解码图的剪枝是一个必要的步骤,常见的就直接使用beam search。另外,在传统语音识别系统中,声学模型的训练通常会占较多资源,因此声学模型不会频繁的更新,这就造成语音识别系统较难快速的针对特定场景优化。考虑这两个问题就有了Lattice的概念。在解码时,采用一些剪枝方法,使得最后获得N-best的路径,由这N-best的路径重新进行确定化等操作后得到的WFST就是Lattice,因此与HCLG一样,Lattice的输入为HMM状态,输出为单词序列。但在kaldi中,对Lattice的生成和存储做了优化[8],使其输入输出都是单词序列,并将HMM状态等信息存在transition中,因此,也通常称Lattice为词图或词格。这样语音识别的解码过程就分为两步(two-pass),第一遍解码得到Lattice,第二遍解码在Lattice中进行最短路径搜索得到1-best的解码结果。业务场景中的实践
语音识别系统在落地时往往同时应用在多个场景和领域,说话人也遍布全国各地,其对话内容、说话环境、口音等都会有很大的差别。在新场景接入时,往往要快速的优化其识别效果,这可以从语言模型、发音词典和解码图的角度实现。1、语言模型的适应
通常在数据充足的条件下,训练数据分布与真实数据越接近,识别效果越好。而如果针对每个场景都做一套语音识别系统可能会因为数据较少导致过拟合问题。对于传统语音识别系统,可以让声学模型在所有场景数据上训练,再使用不同场景数据训练的语言模型对应的解码。下表均使用了同样的声学模型,且该声学模型没有使用业务相关数据训练,我们使用不同的语言模型,在三个不同的业务上验证识别效果(字错率,cer)。可以发现在声学模型不变的情况下,语言模型的训练数据与原始场景越接近,在对应场景下的识别效果就越好。此外,我们计算了语言模型在三个测试数据文本上的ppl,可以发现,在声学模型不变的情况下,测试文本上的ppl的表现与对应的cer基本呈正相关,因此,在优化语言模型时,可以优先在测试集文本上计算ppl,与原始的ppl对比,如果有提升则表示新模型在测试集上表现会好一些。2、Lattice Rescore
根据前面的介绍可知,更新了语言模型通常要更新整个解码图,然后在新解码图上解码。这样的操作是比较复杂的,重新解码的效率也比较低。一种替代的方法是,只在Lattice上面更新语言模型的打分,然后重新在Lattice找出1-best路径即可大大减小重新识别的复杂度。Lattice Rescore[9]可以用两种思路,一是重新构图,即使用新语言模型的G.fst与Lattice重新构图,这种方法效率比较低,而且识别效果并没有提升。使用较多的方式是“先减后加”,我们先看kaldi中Lattice的存储格式。如下图所示,为使用Lattice计算TopN后的一部分,其中包含四列(最后三列是本质是一列由逗号分开的),其中,前两列的序号表示状态,第三列表示边上的单词,最后一列有三个部分,分别是graph cost、acoustic cost和transition-id序列。3、语言模型的融合
与平滑的原理相似,多个语言模型之间是可以融合的[7],融合方式就是简单的插值,即给某个模型一个scale(0<=scale<=1),与另外一个模型中对应单词的分数乘以1-scale相加。通常可以使用一个业务相关小模型和一个预训练的大模型融合,即保证了业务相关性,又可以尽量避免OOV的情况。总结
本文主要从原理的角度介绍了WFST和语言模型在传统语音识别系统中的作用,并结合场景实例介绍了一些优化方法。在实际应用中,随着场景的增加和解码服务的不断成熟,声学模型会趋向于适应更加通用的场景,此时解码图的优化会越来越重要。通常在新增业务场景或者修复badcase时,优化语言模型和词典是比较有效的方法,这也是pipeline结果相比端到端的优势之一。后续将会从典型badcase出发探索传统语音识别系统中解码图相关的优化方法。参考文献:[1] Goodman, S. F. C. a. J. (1999). "An empirical study of smoothing techniques for language modeling."[2] Toma ́sˇ Mikolov1, Martin Karafia ́t (2010). "Recurrent neural network based language model."[3] Mehryar Mohri1, F. P. a. M. R. (2002). "Weighted Finite-State Transducers in Speech Recognition."[4] Mohri1, M. (2008). "SPEECH RECOGNITION WITH WEIGHTED FINITE-STATE TRANSDUCERS."[5] Dixon, P. R. O., Tasuku; Iwano, Koji; Furui, Sadaoki (2009). "Recent Development of WFST-Based Speech Recognition Decoder."[6] Goodman, J. T. (2001). "A Bit of Progress in Language Modeling Extended Version."[7] X. Liu1, M. J. F. G., J.L. Hieronymus2, P.C. Woodland1 (2010). "LANGUAGE MODEL COMBINATION AND ADAPTATION USING WEIGHTED FINITE STATE TRANSDUCERS."[8] Povey, D. (2012). "GENERATING EXACT LATTICES IN THE WFST FRAMEWORK."[9] H.Abdulla, A. A. A. a. W. (2013). "Speech Decoding Using Lattice Rescoring."[10] Daniel Povey1, A. G. (2011). "The Kaldi Speech Recognition Toolkit."[11] Abrash, A. S. J. Z. W. W. V. (2011). "SRILM at Sixteen: Update and Outlook."[12] Marcello Federico, N. B., Mauro Cettolo (2016). "IRSTLM: an Open Source Toolkit for Handling Large Scale Language Models."
周维,58同城AI Lab算法资深开发工程师,2018年5月加入58,先后从事智能客服、语音机器人、写稿机器人和语音识别项目的算法工作,目前主要从事语音识别算法开发。
AI Lab 招聘信息欢迎关注开源项目 qa_matchqa_match是58同城开源的一款基于深度学习的问答匹配工具,支持一层和两层结构知识库问答。qa_match通过意图匹配模型支持一层结构知识库问答,通过融合领域分类模型和意图匹配模型的结果支持两层结构知识库问答。qa_match同时支持无监督预训练功能,通过轻量级预训练语言模型(SPTM,Simple Pre-trained Model)可以提升基于知识库问答等下游任务的效果。github地址:https://github.com/wuba/qa_match
文章介绍:
欢迎关注部门微信公众号:58AILab
欢迎在欣秀(https://app.ic3i.com)平台上加入"58同城AILab技术沙龙"圈子,一起交流技术,可以扫描以下二维码加入该圈子。